// mycond.cc
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;

int cnt = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *Count(void *args)
{
    pthread_detach(pthread_self());
    uint64_t number = (uint64_t)args;
    cout << "thread-" << number << " create success" << endl;

    while (1)
    {
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex);  // pthread_cond_wait让线程等待的时候，会自动释放传进去的锁
        // 一个线程先申请锁成功，进来之后执行wait，线程加入等待队列，并把锁释放，后面的线程就可以继续申请锁了，最后所有新线程都加入等待队列了，就需要主线程来唤醒新线程
        // 不管临界资源的状态情况
        cout << "thread-" << number << ", cnt: " << cnt++ << endl;
        pthread_mutex_unlock(&mutex);
        //sleep(1);
    }
    return nullptr;
}

int main()
{
    for (uint64_t i = 0; i < 5; ++i)
    {
        pthread_t tid;
        pthread_create(&tid, nullptr, Count, (void*)i);
        usleep(1000);  // 休眠一下，让线程按创建顺序入条件变量的等待队列
    }

    sleep(3);
    cout << "main thread ctrl begin: " << endl;

    while (true)
    {
        sleep(1);
        pthread_cond_signal(&cond);  // 唤醒在cond的等待队列中等待的一个线程，默认都是第一个
        // pthread_cond_broadcast(&cond);  // 唤醒在cond的等待队列中等待的所有线程，它们会按顺序轮流访问临界区，也是安全的
        cout << "signal one thread..." << endl;
    }
    return 0;
}